package com.wymobilearchitecture.study.thread.use;


import android.os.AsyncTask;

/**
 * 轻量级的异步任务工具类,提供任务执行的进度回调给UI线程
 * 场景:需要知道任务执行的进度,铎哥任务穿行执行
 * 缺点:生命周期和宿主的生命周期不同步,有可能发生内存泄漏,默认情况所有任务串行执行,当一个任务迟迟执行不完,
 * 下一个任务无法执行,可调用 asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"execute MyAsyncTask")
 */
public class AsyncTaskTest {

    private static String TAG = "MyAsyncTask";
    public AsyncTaskTest() {

        MyAsyncTask myAsyncTask = new MyAsyncTask();
        myAsyncTask.execute("execute myAsyncTask");

        //以这种方式提交的任务,所有的任务穿行执行,即先来后到,但是如果其中有一条任务休眠了,或者执行时间过长,后面的任务都将被阻塞
        //适用于串行执行任务
        AsyncTask.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(TAG + " run AsyncTask.execute");
            }
        });


        //适用于并发执行任务
        AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(TAG + " run AsyncTask.THREAD_POOL_EXECUTOR.execute");
            }
        });
    }

    static class MyAsyncTask extends AsyncTask<String,Integer,String> {

        @Override
        protected String doInBackground(String... strings) {

            for (int i = 0; i < 10; i++) {
                publishProgress(i * 10);
            }
            return strings[0];
        }

        //拿到任务执行进度
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            System.out.println(TAG + " onProgressUpdate: " + values[0]);
        }

        //拿到 AsyncTask 执行结果
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            System.out.println(TAG + " onProgressUpdate: " + result);
        }
    }
}
